package com.weichen.studentgameexchange.comment.common;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.sql.Types;
import java.util.Collections;

public class CodeGenerator {
    public static void main(String[] args) {
        // 创建 FastAutoGenerator 实例，传入数据库连接信息（URL、用户名、密码）
        FastAutoGenerator.create("jdbc:mysql://192.168.80.131:3306/studentgameexchange-comment?serverTimezone=GMT%2B8", "root", "root")
                // 全局配置
                .globalConfig(builder -> {
                    // 设置生成代码的作者
                    builder.author("惟尘")
                            // 开启 swagger 模式，便于接口文档生成和测试
                            .enableSwagger()
                            // 指定代码生成的输出目录
                            .outputDir("E://MavenProject//StudentGameExchange//StudentGameExchange-comment//src//main//java");
                })


                // 数据源配置
                .dataSourceConfig(builder ->
                        // 自定义类型转换处理
                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                            // 获取元数据的 JDBC 类型代码
                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                            // 如果是 SMALLINT 类型，则将其转换为 INTEGER 类型
                            if (typeCode == Types.SMALLINT) {
                                return DbColumnType.INTEGER;
                            } else if (typeCode == Types.TINYINT) {  // 新增处理TINYINT
                                return DbColumnType.INTEGER;  // 或根据业务需求返回Boolean
                            }
                            // 其他类型使用默认的类型转换
                            return typeRegistry.getColumnType(metaInfo);
                        })
                )
                // 包配置
                .packageConfig(builder -> {
                    // 设置父包名
                    builder.parent("com.weichen.studentgameexchange")
                            // 设置父包模块名
                            .moduleName("comment")
                            .entity("entity") // 设置实体类包名
                            .mapper("dao") // 设置 Mapper 接口包名
                            .controller("controller") // 设置 Controller 包名
                            .service("service") // 设置 Service 接口包名
                            .serviceImpl("service.impl") // 设置 Service 实现类包名
                            .xml("mappers"); // 设置 Mapper XML 文件包名
                })
                // 策略配置
                .strategyConfig(builder -> {
                    // 设置需要生成代码的表名列表，可以添加多个表名
                    builder.addInclude("comment", "comment_audit_log", "comment_like", "comment_reply", "comment_reply_like", "comment_report")
                            // 设置过滤表前缀，符合该前缀的表将被过滤掉
                            .addTablePrefix("t_", "c_")
                            .entityBuilder()
                            .enableLombok() // 启用 Lombok
                            .enableTableFieldAnnotation() // 启用字段注解
                            .controllerBuilder()
                            .enableRestStyle(); // 启用 REST 风格
                    // 为实体类添加表字段注解，增强代码可读性
                    builder.entityBuilder().addTableFills(
                            new Column("create_time", FieldFill.INSERT),   // 插入时填充
                            new Column("update_time", FieldFill.INSERT_UPDATE)  // 插入和更新时填充
                    );
                })
                // 使用 Freemarker 引擎模板，默认是 Velocity 引擎模板
                .templateEngine(new FreemarkerTemplateEngine())
                // 执行代码生成操作
                .execute();
    }
}